Skip to content

fix(seo): SEO/GEO/AEO audit fixes for -new draft pages, part 2#507

Merged
mohanadft merged 4 commits into
mainfrom
seo/new-pages-audit-fixes
Jul 14, 2026
Merged

fix(seo): SEO/GEO/AEO audit fixes for -new draft pages, part 2#507
mohanadft merged 4 commits into
mainfrom
seo/new-pages-audit-fixes

Conversation

@mohanadft

@mohanadft mohanadft commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Follow-up to #505/#506 — a second, more thorough SEO/GEO/AEO audit of all 24 -new draft pages (via the claude-seo skill's parallel technical/content/schema/GEO specialist passes), plus fixes. All 24 pages remain noindex'd and excluded from the sitemap — this PR only improves the drafts themselves, it does not launch them.

  • Schema hygiene: removed deprecated HowTo/HowToStep markup (retired by Google Sept 2023) from incubator/mentorship/volunteer-new; gave the site's NonprofitOrganization node a shared @id and linked page-level schema fragments to it instead of creating duplicate/orphan Organization entities; added page-specific schema (ItemList, WebPage, BreadcrumbList) to the 4 pages that had none
  • Title/description fixes: 5 pages missing the site's brand suffix, 2 descriptions over the 160-char SERP truncation limit, a couple of inconsistent/dev-facing titles
  • Render-visibility fix: MembershipDues and SignatoriesNew were client:only, so their real content (dues formula, fee-waiver list, pledge signatories) rendered as an empty shell to crawlers/AI search. Fixed the SSR-unsafe window/localStorage access and switched both to client:load with server-fetched initial data
  • Content depth: fleshed out contact-new (was ~85 words, no response time or address), added a real definitional passage to about-new instead of burying it in the meta description, added static fallback copy to events-new/faq-new so a Notion outage doesn't leave a near-blank page, reworked 6 headings into question form for AI Overview/answer-engine extraction
  • GEO surface: added public/llms.txt (org summary + 16 live key pages), explicit robots.txt allow rules for major AI crawlers
  • Live-crawl perf fix: curled the live /home-new page directly and found the open-roles fetch was unbounded and averaging ~0.7-0.8s per request — added a timeout so a hanging upstream can't stall SSR; fixed two footer images missing loading="lazy"

Explicitly not done (documented in commit messages, not silently skipped):

  • team-new's per-director bios and quantified stats on 3 of 4 featured tools need real facts (bios, LinkedIn URLs, usage numbers) that don't exist in this codebase — fabricating them would put false claims about named staff and real products on a public nonprofit page
  • The conversions.*.css chunk issue (81KB render-blocking CSS unrelated to page content, loaded on every HomeLayout page, not just -new ones) needs its own investigation into Vite's chunk-splitting — too broad a blast radius to fix blindly here
  • The full launch cutover (swapping drafts into their real URLs, rewriting internal nav links, removing noindex) is a separate, deliberate decision — not part of this PR

Test plan

  • pnpm check — 0 errors, 0 warnings across all 4 commits
  • pnpm build — succeeds; spot-checked compiled output for HowTo removal, @id merging, breadcrumb/ItemList schema, datePublished, event image, and the timeout fix
  • Visual/functional review of the 24 draft pages (not done by this PR — recommend before any future launch)

Addresses the Critical/High findings from the -new pages SEO/GEO/AEO
audit that are safe to ship while pages stay noindexed:

- Remove deprecated HowTo/HowToStep schema (retired by Google Sept
  2023) from incubator-new, mentorship-new, volunteer-new
- Add a shared #organization @id to HomeLayout's NonprofitOrganization
  node and reference it from donate-new, donate-2-new, media-new, and
  contact-new so their page-level schema fragments merge into one
  entity instead of creating duplicate/orphan Organization nodes
- Add a canonicalUrl override prop to HomeLayout and point
  donate-2-new at /donate to codify the primary/fallback relationship
  before either page goes live
- Fix 5 titles missing the site's "| Tech for Palestine" brand suffix
  (endorsements, london-gathering, legal, privacy-policy, terms)
- Trim 2 meta descriptions over the 160-char SERP truncation limit
  (e4p, london-gathering)
- Fix home-new title capitalization/length and drop the redundant
  "T4P" prefix on tools-new's title
…pages

Addresses the content/E-E-A-T and GEO findings from the -new pages
SEO/GEO/AEO audit:

- Fix MembershipDues to compute its A/B variant assignment (URL param,
  localStorage) inside an effect instead of a useState initializer, so
  the component no longer crashes under SSR; switch membership-new
  from client:only to client:load so the dues formula, fee-waiver
  list, and tax-deductibility copy are now in the crawlable HTML
- Add fetchE4PSignatories to notionClient.ts (mirrors the existing
  fetchNotionEvents/fetchNotionFAQ pattern) and use it to server-fetch
  signatories for e4p/pledge-new, switching SignatoriesNew from
  client:only to client:load with the fetched data as initial props
- Flesh out contact-new (response-time SLA, registered address, FAQ
  link, social links) from ~85 to 250+ words; align the endorsements
  card's review-time language with the endorsements-new page
- Add a definitional "what is Tech for Palestine" passage to
  about-new's visible body copy, not just its meta description
- Add static fallback copy to events-new (independent of the Notion
  fetch) and expand faq-new's fallback FAQ list from 3 to 6 items
- Rework 6 declarative H2s into question form across donate-new,
  membership-new, incubator-new (x2), mentorship-new, and
  volunteer-new for better AI Overview/answer-engine extraction
- Add missing recommended `image` to the Event schema on events-new
  and london-gathering-new; add datePublished + <time datetime> to
  media-new's press coverage; add <time datetime> to event dates in
  EventsNew.tsx
- Add page-specific schema to the four pages that had none: ItemList
  for home-new's open roles and ideas-new's project ideas, WebPage
  for get-involved-new, and BreadcrumbList for the two nested routes
  (e4p/pledge-new, help/hire-new)
- Link Person.worksFor nodes (about-new, team-new) to the shared
  #organization @id; add the founder's real image URL to about-new's
  Person schema

Skipped by design: team-new's per-director bios and quantified
"impact" stats on tools-new's Thaura/Newscord/Boycat/Find-a-Protest
cards both need real facts (bios, LinkedIn URLs, usage numbers) that
don't exist in this codebase — fabricating them would put false
claims about named staff and real products on a public nonprofit
page. UpScrolled's existing Al Jazeera coverage (already cited on
media-new) was added since it's a verified fact.
…nical normalization

Addresses the remaining GEO/technical findings from the -new pages
SEO/GEO/AEO audit that don't depend on a live preview deploy:

- Add public/llms.txt: org summary, mission, EIN, and 16 key live
  pages with one-line descriptions. Points only at the live canonical
  URLs (e.g. /about, /donate) — deliberately excludes the noindexed
  -new draft variants per the audit's own guidance
- Add explicit Allow rules in robots.txt for GPTBot, ChatGPT-User,
  OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, and
  Google-Extended. Functionally redundant with the existing wildcard
  allow, but makes AI-crawler access an explicit, intentional signal
  rather than an implicit side effect
- Normalize the trailing slash in HomeLayout's canonical URL
  construction so /page and /page/ always emit the same
  self-referential canonical, matching the trailing-slash-free
  convention already used by all internal links sitewide. Scoped to
  canonical-tag construction rather than astro.config.mjs's
  trailingSlash setting, to avoid changing routing/redirect behavior
  for the ~60 existing live pages

Not done in this pass: firming up the Performance/Images audit scores
requires a live preview deploy to crawl (Core Web Vitals field data
and image analysis can't be produced from source alone) — flagging
for a follow-up once a preview URL exists.
…me-new

Measured the live production page directly (curl timing + response
inspection) to replace guesswork with real data for the Performance/
Images audit score:

- open-roles fetch in home-new.astro has averaged ~0.7-0.8s round-trip
  in production and was unbounded — a hanging upstream would stall
  SSR indefinitely. Add a 3s AbortSignal.timeout so it degrades to the
  existing empty-array fallback instead of hanging the whole page.
- Two below-the-fold footer images (brand logo, UpScrolled social
  icon) were missing loading="lazy" in FooterSection.astro, which is
  shared by every -new page.

Also confirmed via live crawl but NOT fixed here (out of scope / too
risky for this pass): every HomeLayout-based page — not just
home-new — loads two "conversions.*.css" chunks (~81KB combined,
render-blocking) that belong to the unrelated admin conversions
dashboard. This is a sitewide Vite CSS-chunk-splitting artifact, not
a home-new-specific bug, and needs its own investigation into the
build's chunking behavior rather than a blind fix that could affect
styling across all ~60 live pages.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying website with  Cloudflare Pages  Cloudflare Pages

Latest commit: d28bb5a
Status: ✅  Deploy successful!
Preview URL: https://6e362bc0.website-aun.pages.dev
Branch Preview URL: https://seo-new-pages-audit-fixes.website-aun.pages.dev

View logs

@mohanadft mohanadft merged commit 5d041bd into main Jul 14, 2026
5 checks passed
@mohanadft mohanadft deleted the seo/new-pages-audit-fixes branch July 14, 2026 10:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant